package com.rome.hotel.data.service.impl;

import java.math.BigDecimal;
import java.util.List;

import com.rome.hotel.data.controller.CommonFileUpOrDown;
import com.rome.hotel.data.utils.RegexUtils;
import io.jsonwebtoken.lang.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rome.hotel.data.mapper.HotelUserMapper;
import com.rome.hotel.data.domain.HotelUser;
import com.rome.hotel.data.service.IHotelUserService;

/**
 * 酒店会员Service业务层处理
 *
 * @author rome
 * @date 2023-12-06
 */
@Service
public class HotelUserServiceImpl implements IHotelUserService
{
    @Autowired
    private HotelUserMapper hotelUserMapper;

    /**
     * 查询酒店会员
     *
     * @param userId 酒店会员主键
     * @return 酒店会员
     */
    @Override
    public HotelUser selectHotelUserByUserId(Long userId)
    {
        return hotelUserMapper.selectHotelUserByUserId(userId);
    }

    /**
     * 查询酒店会员列表
     *
     * @param hotelUser 酒店会员
     * @return 酒店会员
     */
    @Override
    public List<HotelUser> selectHotelUserList(HotelUser hotelUser)
    {
        return hotelUserMapper.selectHotelUserList(hotelUser);
    }

    /**
     * 新增酒店会员
     *
     * @param hotelUser 酒店会员
     * @return 结果
     */
    @Override
    public int insertHotelUser(HotelUser hotelUser)
    {

//        防御性编程
        Assert.notNull(hotelUser,"参数异常");
        Assert.notNull(hotelUser.getUsername(),"账号不能为空");
        Assert.notNull(hotelUser.getPassword(),"密码不能为空");
        Assert.notNull(hotelUser.getNickname(),"昵称不能为空");
        Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getUsername()),"账号长度不能超过30");
        Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getPassword()),"密码长度不能超过30");

//        判断是否传入年龄参数
        if(hotelUser.getAge()!=null){
            Assert.state(RegexUtils.testAge(hotelUser.getAge().toString()),"年龄大于0小于300且为数字");
        }
        //        判断是否传入手机号参数
        if(hotelUser.getPhoneNumber()!=null){
            Assert.state(RegexUtils.testPhoneNumber(hotelUser.getPhoneNumber()),"请输入规范的手机号");
        }
        //        判断是否传入邮箱参数
        if(hotelUser.getEmail()!=null){
            Assert.state(hotelUser.getEmail().length()<30,"邮箱长度不能超过30");
            Assert.state(RegexUtils.testEmail(hotelUser.getEmail()),"请输入规范的邮箱");
        }
        //        判断是否传入金额参数
        if(hotelUser.getBalance()!=null){
            Assert.state(RegexUtils.testBalance(hotelUser.getBalance().toString()),"请输入规范的金额");
        }else {
            hotelUser.setBalance(new BigDecimal(0.0));
        }
        //        根据账号来查询数据库中是否已存在此账号
        HotelUser queryUsername = hotelUserMapper.selectHotelUserByUsername(hotelUser.getUsername());
        Assert.state(queryUsername==null,"账号已存在");
//        将头像地址存储实体类中
        hotelUser.setAvatar( CommonFileUpOrDown.imgNmae );
//        将地址清空
        CommonFileUpOrDown.imgNmae =null;
        return hotelUserMapper.insertHotelUser(hotelUser);
    }

    /**
     * 修改酒店会员
     *
     * @param hotelUser 酒店会员
     * @return 结果
     */
    @Override
    public int updateHotelUser(HotelUser hotelUser)
    {
//        防御性编程
        Assert.notNull(hotelUser,"参数异常");
        Assert.notNull(hotelUser.getUsername(),"账号不能为空");
        Assert.notNull(hotelUser.getPassword(),"密码不能为空");
        Assert.notNull(hotelUser.getNickname(),"昵称不能为空");
        Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getUsername()),"账号长度不能超过30");
        Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getPassword()),"密码长度不能超过30");
//        判断是否传入年龄参数
        if(hotelUser.getAge()!=null){
            Assert.state(RegexUtils.testAge(hotelUser.getAge().toString()),"年龄大于0小于300且为数字");
        }
        //        判断是否传入手机号参数
        if(hotelUser.getPhoneNumber()!=null){
            Assert.state(RegexUtils.testPhoneNumber(hotelUser.getPhoneNumber()),"请输入规范的手机号");
        }
        //        判断是否传入邮箱参数
        if(hotelUser.getEmail()!=null){
            Assert.state(hotelUser.getEmail().length()<30,"邮箱长度不能超过30");
            Assert.state(RegexUtils.testEmail(hotelUser.getEmail()),"请输入规范的邮箱");
        }
        //        判断是否传入金额参数
        if(hotelUser.getBalance()!=null){
            Assert.state(RegexUtils.testBalance(hotelUser.getBalance().toString()),"请输入规范的金额");
        }
        //        根据账号来查询数据库中是否已存在此账号
        HotelUser queryHotelUserByUsername = hotelUserMapper.selectHotelUserByUsername(hotelUser.getUsername());
        Assert.state(queryHotelUserByUsername!=null,"账号不存在");
        //        将头像地址存储实体类中
       if(CommonFileUpOrDown.imgNmae!=null){
           hotelUser.setAvatar(CommonFileUpOrDown.imgNmae);
       }
//        将地址清空
        CommonFileUpOrDown.imgNmae=null;
        return hotelUserMapper.updateHotelUser(hotelUser);
    }

    /**
     * 批量删除酒店会员
     *
     * @param userIds 需要删除的酒店会员主键
     * @return 结果
     */
    @Override
    public int deleteHotelUserByUserIds(Long[] userIds)
    {
        for (Long id:userIds
             ) {

                Assert.notNull(hotelUserMapper.selectHotelUserByUserId(id),"参数异常");
        }
        return hotelUserMapper.deleteHotelUserByUserIds(userIds);
    }

    /**
     * 删除酒店会员信息
     *
     * @param userId 酒店会员主键
     * @return 结果
     */
    @Override
    public int deleteHotelUserByUserId(Long userId)
    {
//        1.防御性编程
        HotelUser hotelUser = hotelUserMapper.selectHotelUserByUserId(userId);
        Assert.notNull(hotelUser,"参数异常");
        return hotelUserMapper.deleteHotelUserByUserId(userId);
    }

    /**
     * 根据账号查询酒店会员
     * @param username
     * @return
     */
    public HotelUser selectHotelUserByUsername(String username){
        return hotelUserMapper.selectHotelUserByUsername(username);
    }
}
